/**
 * @file binarize.h
 * @brief 二值化和边线提取模块接口
 * 
 * 包含图像二值化和赛道边线提取功能。
 * 为后续巡线算法提供基础数据。
 */
#ifndef BINARIZE_H
#define BINARIZE_H
#include <platform.h>

/**
 * @brief 图像二值化函数
 * @param gray 输入灰度图像 [height][320]
 * @param binary 输出二值图像 [height][320]
 * @param height 图像高度
 * @param width 图像宽度
 * @param threshold 二值化阈值
 * 
 * @note 像素值 > threshold 为 255（白色背景），否则为 0（黑色赛道）
 */
void binarizeImage(
    const unsigned char gray[][SCALED_WIDTH],
    unsigned char binary[][SCALED_WIDTH],
    int height, int width,
    unsigned char threshold
);


/**
 * @brief 基于追踪的左边线提取（可选算法）
 * @param bin 已二值化图像（0=黑，255=白）
 * @param height 图像高度
 * @param width 图像宽度
 * @param leftCol 输出的每行左边线列号，未找到时填 -1
 *
 * 说明/假设：实现参考用户提供的伪代码并作了小幅稳健化处理：
 * - 使用 8 邻域移动，方向索引 2 被视为“向上”（dy=-1，dx=0）。
 * - 底行种子从底行最长的白段的左侧找紧邻的黑像素；若找不到则退回到该段左边界。
 * - 在向上逐行爬时，优先从上方向（dir）开始，按左右交替扩展搜索。
 * - 为了避免越界，会检查 nx/ny 的有效性。
 */
/**
 * @brief 同时追踪左右边线的包装函数（合并实现）
 * @note 内部实现基于“接缝/区域”判定，带有漂移限制和小范围投票搜索，便于减小顶端区域漂移。
 */
void trackEdges(
    const unsigned char bin[][SCALED_WIDTH],
    int height, int width,
    int leftCol[], int rightCol[]
);

/*
 * Configuration macros for trackEdges tuning. Change these values when
 * debugging on PC or tuning on the target (e.g., Infineon TC264).
 * - TRACK_MAX_RADIUS: maximum search radius (pixels) when growing from previous row
 * - TRACK_SEAM_WIDTH: half-window width used for local seam (black/white) test
 * - TRACK_MAX_DRIFT_TOP: maximum allowed drift (pixels) in the top region if you want stronger protection
 */
#ifndef TRACK_MAX_RADIUS
#define TRACK_MAX_RADIUS 6
#endif

#ifndef TRACK_SEAM_WIDTH
#define TRACK_SEAM_WIDTH 3
#endif

#ifndef TRACK_MAX_DRIFT_TOP
#define TRACK_MAX_DRIFT_TOP 8
#endif

#endif // BINARIZE_H
